/*
 * Tema.java
 *
 */

package InterfazBD;

import Beans.*;
import java.sql.*;
import java.util.*;


/**
 *
 * @author Marco Sobrino
 */
public class Tema {
    
    private BeanTema datosTema;
    
    private LinkedList<ResuSet> temas;
    
    /** Creates a new instance of Tema */
    public Tema() {
    }

    /**
     * Getter for property datosTema.
     * @return Value of property datosTema.
     */
    public BeanTema getDatosTema() {
        return this.datosTema;
    }

    /**
     * Setter for property datosTema.
     * @param datosTema New value of property datosTema.
     */
    public void setDatosTema(BeanTema datosTema) {
        this.datosTema = datosTema;
    }
    
    /**
     * Agrega un nuevo tema a un examen
     */    
    public void agregarTema() throws Exception {
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        Statement stm = conn.createStatement();
        
        stm.execute("INSERT INTO web.tema (idexamen, titulo, enunciado, puntaje, tipo) values (" +
                datosTema.getIdExamen() + 
                ",\'" + datosTema.getTitulo() +"\', " +
                "\'" +datosTema.getEnunciado()+ "\', " + 
                datosTema.getPuntaje() +
                ",\'"+ datosTema.getTipo()+"\')");
        stm.close();
        conexionBD.desconectar();
    }   
    
    /**
     * Quita el tema del examen
     */    
    public void borrarTema(int idTema) throws Exception {
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        Statement stm = conn.createStatement();
        
        stm.execute("delete from web.tema where idtema = "+idTema);
        stm.close();
        conexionBD.desconectar();
    } 
    
    /**
     * Trae el idTema de la base de datos y lo carga a el atributo del bean
     */
    public static int cargarIdTema(int idExam) throws Exception {
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        Statement stm = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                                             ResultSet.CONCUR_UPDATABLE);
        ResultSet fila = stm.executeQuery("SELECT max(idtema) FROM web.tema " +
                                          "WHERE idexamen = \'"+ idExam +"\'");
        fila.next();
            
        //trae el unico elemento del resulset
        int id = fila.getInt(1);
        
        stm.close();
        conexionBD.desconectar();
        
        return id;
    }    

    /**
     * Guarda en una lista todos los temas de un Examen
     */
    public void traerTemasExamen(int idExam) throws Exception {
        Conexion conexionBD = new Conexion();               
        Connection conn = conexionBD.conectar();        
        Statement stm = conn.createStatement();               
        
        temas = new LinkedList();
        ResultSet tem = stm.executeQuery("SELECT * " +
                                         "FROM web.tema " +
                                         "WHERE idexamen = "+idExam + " "+                                                        
                                         "ORDER BY idtema");
        int enumtem = 1;
        while(tem.next()){                        
            ResuSet obj = new ResuSet();
            
            obj.SetColumna6(tem.getInt(1));
            obj.SetColumna7(tem.getInt(2));
            obj.SetColumna1(tem.getString(3));
            obj.SetColumna2(tem.getString(4));
            obj.SetColumna8(tem.getInt(5));
            obj.SetColumna9(enumtem++);
            obj.SetColumna3(tem.getString(6));
            
            temas.add(obj);
        }
                
        stm.close();
        conexionBD.desconectar();   
    }
    
    /**
     * Devuelve el linked list a control
     */
    public LinkedList<ResuSet> getTemas() {
        return temas;
    }   
    
    /**
     * Dependiendo de las respuestas calcula el puntaje obtenido por un alumno en un tema
     */
    public double calcularPuntajeTema(int idAlumno,int temaNro) throws Exception {
        Conexion conexionBD = new Conexion();
        Connection conn = conexionBD.conectar();
        Statement stm = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                                             ResultSet.CONCUR_UPDATABLE);
        ResultSet fila = stm.executeQuery("select puntaje " +
                "from web.tema where idtema = "+temaNro);
        fila.next();
        int puntajeTema = fila.getInt(1);
        
        int contTrue = 0;
        int aciertos = 0;
                
       ResultSet opciones = stm.executeQuery("select o.* " +
                "from web.opcion as o inner join web.tema as t on t.idtema = o.idtema " +
                "where o.idtema = "+temaNro);
                        
        int idOpcion;
        char valor;
        Eleccion elecc = new Eleccion();
        
        while(opciones.next()){             
            //guarda si la respuesta es S o N
            idOpcion = opciones.getInt(1);
            valor = opciones.getString(3).charAt(0);
            
            if (valor == 'S' || valor== 's')               
               contTrue += 1;

            System.out.println("11111111111");
            
            if (elecc.existeEleccion(idAlumno,temaNro,idOpcion)){                
                if (valor == 'S' || valor== 's')               
                    aciertos += 1;                                
            }
        }
        
        System.out.println("222222222222");
        double puntOpcion = 0;
        double puntTemaAlum = 0;        
        //cuando todo se ejecuta normalmente
        if (contTrue > 0 && aciertos > 0){
            puntOpcion = ((double)puntajeTema)/(double)contTrue;
            puntTemaAlum = puntOpcion * aciertos;
        }else if(contTrue == 0 && aciertos == 0){ //todas las opciones son nulas
            puntTemaAlum = puntajeTema*(1.0);
        }
        
        stm.close();
        conexionBD.desconectar();
        
        return puntTemaAlum;
    }
}
